<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1-transitional.dtd">
<!-- saved from url=(0013)about:internet -->
<?xml-stylesheet type="text/xsl" href="mathml.xsl"?><html xmlns="http://www.w3.org/1999/xhtml" xmlns:pref="http://www.w3.org/2002/Math/preference" xmlns:xlink="http://www.w3.org/1999/xlink" pref:renderer="mathplayer-dl">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <style xmlns="" type="text/css">
    /* This style sets a margin around the entire page */
        html, body {
            margin: 10px;
        }

        p {
            font: normal 16px verdana, sans-serif;
            margin: 0;
            padding-bottom:12px;
        }

        h1 {
            font: bold 25px verdana, sans-serif;
            margin-top: 0;
            margin-bottom: 3px;
            padding-top: 0;
            padding-bottom: 0;
        }

        h2 {
            font: bold 19px verdana, sans-serif;
            margin-top: 28px;
            margin-bottom: 3px;
            padding-top: 0;
            padding-bottom: 0;
        }

        h3 {
            font: bold 19px verdana, sans-serif !important;
            margin-top: 28px;
            margin-bottom: 3px;
            padding-top: 0;
            padding-bottom: 0;
        }

        li {
            font: normal 16px verdana, sans-serif;
            margin-top: 0;
            margin-bottom: 18px;
            padding-top: 0;
            padding-bottom: 0;
        }

        .pdparam {
            font: italic 16px verdana, sans-serif;
        }

                .term {
                        font: italic 16px verdana, sans-serif;
                        font-weight: normal;
                }

                .type {
                        font: normal 16px verdana, sans-serif !important;
                }

                .parameter {
                        font-style: italic;
                        }

        a:link, a:visited {
            color: blue;
            text-decoration: none;
            font: normal 16px;
        }

        a:hover {
            background-color: #FFFF99;
            font: normal 16px;
        }

        div.funcsynopsis {
            text-align: left;
            background-color: #e6e6e6;
            font: normal 16px verdana, sans-serif;
                        padding-top: 10px;
                        padding-bottom: 10px;
        }

        div.funcsynopsis table {
            border-collapse: separate;
            font: normal 16px verdana, sans-serif;
        }

        div.funcsynopsis td {
            background-color: #e6e6e6;
            border: 0 solid #000;
            padding: 1px;
            font: normal 16px verdana, sans-serif;
        }

        div.refsect1 {
            font-family: verdana, sans-serif;
            font-size: 16px;
        }

        code.constant {
            font: normal 16px courier new, monospace !important;
        }

                span.errorname {
            font: normal 16px verdana, sans-serif !important;
        }

        code.function {
            font: bold 16px verdana, sans-serif !important;
        }

        b.fsfunc {
            font: bold 16px verdana, sans-serif !important;
        }

        code.varname {
            font: italic 16px verdana, sans-serif;
        }

        code.replaceable {
            font: italic 16px courier new, monospace;
        }

        code.funcdef {
            font: normal 16px verdana, sans-serif !important;
        }

        .citerefentry {
            font: normal 16px verdana, sans-serif !important;
        }

        .parameter {
            font-style: italic;
        }

        code.fsfunc {
            font: normal 16px verdana, sans-serif !important;
        }

        /* PARAMETER: This style controls spacing between the terms in Parameter section */
        dt {
            margin-top: 15px;
        }

        /* TABLES: These styles apply to all tables OTHER than the Synopsis and Example tables */
        div.refsect1 table {
            width: 100%;
                        margin-top: 10px;
            background-color: #FFF;
                        border-collapse: collapse;
                        border-color: #000;
            border-width: 1px;
                        font: normal 16px verdana, sans-serif;
        }

        div.refsect1 th {
                        border-collapse: collapse;
                        border-color: #000;
            border-width: 1px;
            font: bold 16px verdana, sans-serif;
        }

        div.refsect1 td {
            background-color: #FFF;
            padding: 5px;
            vertical-align: text-top;
                        border-collapse: collapse;
                        border-color: #000;
            border-width: 1px;
            font: normal 16px verdana, sans-serif;
        }

                  div.refsect1 p{
            font: normal 16px verdana, sans-serif;
            margin-top: 8px;
            margin-bottom: 8px;
            padding-top: 0;
            padding-bottom: 0;
        }


        /* EXAMPLE: These styles apply only to the Example section */
        div.refsect2 {
            font: normal 16px courier new, monospace !important;
        }

        div.refsect2 table {
            margin-top: 0;
            background-color: #e6e6e6;
            width: 100%;
            border: 0 solid #000;
            padding: 2px;
            font: normal 16px courier new, monospace !important;
        }

        div.refsect2 td {
            background-color: #e6e6e6;
            font: normal 16px courier new, monospace !important;
                        white-space:pre;
        }

        /* COPYRIGHT: This style formats the text of the copyright statement at the bottom of the page */
        div.refsect3 {
            font: normal 11px verdana, sans-serif;
            margin-top: 50px;
            margin-bottom: 20px;
            padding-top: 0;
            padding-bottom: 0;
        }

</style>
    <title>cl_khr_icd</title>
    <meta name="generator" content="DocBook XSL Stylesheets V1.78.1" />
    <meta name="keywords" content="cl_khr_icd" />
  </head>
  <body>
    <div class="refentry">
      <a id="id-1"></a>
      <div class="titlepage"></div>
      <div xmlns="" class="refnamediv">
        <a xmlns="http://www.w3.org/1999/xhtml" id="cl_khr_icd"></a>
        <h1>cl_khr_icd</h1>
        <p>
            Extension through which the Khronos
            OpenCL installable client driver loader (ICD Loader) 
            may expose multiple separate vendor 
            installable client drivers (Vendor ICDs) for OpenCL.
        </p>
      </div>
      <div class="refsect2">
        <a id="synopsis"></a>
        <h3>
        </h3>
        <div class="informaltable">
          <table border="0">
            <colgroup>
              <col align="left" class="col1" />
            </colgroup>
            <tbody>
              <tr>
                <td align="left">
#pragma OPENCL EXTENSION cl_khr_icd : enable
                        </td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
      <div class="refsect1">
        <a id="description"></a>
        <h2>Description</h2>
        <p>
            This is a platform extension which defines a simple mechanism through 
            which the Khronos OpenCL installable client driver loader (ICD Loader) 
            may expose multiple separate vendor installable client drivers (Vendor ICDs) 
            for OpenCL. An application written against the ICD Loader will be able to 
            access all <span class="type">cl_platform_ids</span> exposed by all vendor implementations with the 
            ICD Loader acting as a demultiplexor. If this extension is supported by an 
            implementation, the string <code class="function">cl_khr_icd</code> will be present 
            in the <code class="constant">CL_PLATFORM_EXTENSIONS</code> string described in
            the table of allowed values for <code class="varname">param_name</code> for
            <a class="citerefentry" href="clGetDeviceInfo.html"><span class="citerefentry"><span class="refentrytitle">clGetDeviceInfo</span></span></a>.
        </p>
        <p>
          If the <code class="function">cl_khr_icd</code> extension is supported, then the
          <a class="citerefentry" href="clIcdGetPlatformIDsKHR.html"><span class="citerefentry"><span class="refentrytitle">clIcdGetPlatformIDsKHR</span></span></a>
          function is enabled.
        </p>
        <p>
            The official source for the ICD loader is available at the 
            Khronos website. The complete <code class="code">_cl_icd_dispatch</code> 
            structure is defined in the header <code class="code">icd_dispatch.h</code> 
            which is available as a part of the source code.
        </p>
        <h4><a id="id-1.5.5"></a>Inferring Vendors from Function Call Arguments</h4>
        <p>
            At every OpenCL function call, the ICD Loader infers the vendor ICD function to call from the 
            arguments to the function. An object is said to be ICD compatible if it is of the following 
            structure:
        </p>
        <p>
</p>
        <div class="literallayout">
          <p>
            <code class="code">     struct _cl_&lt;object&gt;<br />
     {<br />
         struct _cl_icd_dispatch *dispatch;<br />
         // ... remainder of internal data<br />
     };</code>
          </p>
        </div>
        <p>
        </p>
        <p>
            <code class="code">&lt;object&gt;</code> is one of <code class="code">platform_id</code>, 
            <code class="code">device_id</code>, <code class="code">context</code>, 
            <code class="code">command_queue</code>, <code class="code">mem</code>, 
            <code class="code">program</code>, <code class="code">kernel</code>, 
            <code class="code">event</code>, or <code class="code">sampler</code>.
        </p>
        <p>
            The structure <code class="code">_cl_icd_dispatch</code> is a function 
            pointer dispatch table which is used to direct 
            calls to a particular vendor implementation. All objects 
            created from ICD compatible objects
            must be ICD compatible.
        </p>
        <p>
            A link to source code which defines the entries 
            in the function table structure 
            <code class="code">_cl_icd_dispatch</code> is available in the 
            Sample Code section of the OpenCL specification. The order of 
            the functions in <code class="code">_cl_icd_dispatch</code> is 
            determined by the ICD Loader's source. The ICD
            Loader's source's <code class="code">_cl_icd_dispatch</code> 
            table is to be appended to only.
        </p>
        <p>
            Functions which do not have an argument from which the vendor implementation may be 
            inferred are ignored, with the exception of 
            <code class="function">clGetExtensionFunctionAddress</code> 
            which is described below. 
        </p>
        <h4><a id="id-1.5.12"></a>ICD Data</h4>
        <p>
            A Vendor ICD is defined by two pieces of data:
        </p>
        <div class="itemizedlist">
          <ul class="itemizedlist" style="list-style-type: disc; ">
            <li class="listitem">
                The Vendor ICD library specifies a library which contains the OpenCL entry points for 
                the vendor's OpenCL implementation. The vendor ICD's library file name should include 
                the vendor name, or a vendor-specific implementation identifier.
           </li>
            <li class="listitem">
                The Vendor ICD extension suffix is a short string which specifies the default suffix for 
                extensions implemented only by that vendor. See Additions to Chapter 9 for details on 
                the mechanism through which this is accomplished. The vendor suffix string is optional.
           </li>
          </ul>
        </div>
        <h4><a id="id-1.5.15"></a>ICD Loader Vendor Enumeration on Windows</h4>
        <p>
            To enumerate Vendor ICDs on Windows, the ICD 
            Loader scans the values in the registry key
            <code class="code">HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors</code>. 
            For each value in 
            this key which has <span class="type">DWORD</span> data set to 0, the 
            ICD Loader opens the dynamic link library 
            specified by the name of the value using 
            <span class="type">LoadLibraryA</span>.
        </p>
        <p>
            For example, if the registry contains the following value
        </p>
        <p>
</p>
        <div class="literallayout">
          <p>     [HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors]<br />
     "c:\\vendor a\\vndra_ocl.dll"=dword:00000000</p>
        </div>
        <p>
        </p>
        <p>
            then the ICD will open the library "<code class="code">c:\vendor a\vndra_ocl.dll</code>".
        </p>
        <h4><a id="id-1.5.20"></a>ICD Loader Vendor Enumeration on Linux</h4>
        <p>
            To enumerate vendor ICDs on Linux, the ICD 
            Loader scans the files in the path 
            <code class="code">/etc/OpenCL/vendors</code>. For each 
            file in this path, the ICD Loader opens the 
            file as a text
            file. The expected format for the file is a 
            single line of text which specifies the Vendor ICD's 
            library. The ICD Loader will attempt to open 
            that file as a shared object using <code class="code">dlopen()</code>. 
            Note that the library specified may be an 
            absolute path or just a file name.
        </p>
        <p>
            For example, if the following file exists 
            <code class="code">/etc/OpenCL/vendors/VendorA.icd</code> and 
            contains the text <code class="code">libVendorAOpenCL.so</code> 
            then the ICD Loader will load the library 
            "<code class="code">libVendorAOpenCL.so</code>".
        </p>
        <h4><a id="id-1.5.23"></a>ICD Loader Vendor Enumeration on Android</h4>
        <p>
            To enumerate vendor ICDs on Android, the ICD 
            Loader scans the files in the path 
            <code class="code">/system/vendors/Khronos/OpenCL/vendors</code>. 
            For each file in this path, the ICD 
            Loader opens the file as a text file. The expected 
            format for the file is a single line of text which 
            specifies the Vendor ICD's library. The ICD Loader 
            will attempt to open that file as a shared 
            object using <code class="code">dlopen()</code>. Note that the 
            library specified may be an absolute path or just a file 
            name.
        </p>
        <p>
            For example, if the following file exists
            <code class="code">/system/vendors/Khronos/OpenCL/vendors/VendorA.icd</code> 
            and contains the text
            <code class="code">libVendorAOpenCL.so</code> then the ICD Loader 
            will load the library 
            "<code class="code">libVendorAOpenCL.so</code>".
        </p>
        <h4><a id="id-1.5.26"></a>Adding a Vendor Library</h4>
        <p>
            
            Upon successfully loading a Vendor ICD's library, the ICD Loader queries the following 
            functions from the library: 
            <a class="citerefentry" href="clIcdGetPlatformIDsKHR.html"><span class="citerefentry"><span class="refentrytitle">clIcdGetPlatformIDsKHR</span></span></a>, 
            <a class="citerefentry" href="clGetPlatformInfo.html"><span class="citerefentry"><span class="refentrytitle">clGetPlatformInfo</span></span></a>, and 
            <code class="function">clGetExtensionFunctionAddress</code>. 
            If any of these functions are not present then the ICD Loader 
            will close and ignore the library.
        </p>
        <p>
            Next the ICD Loader queries available
            ICD-enabled platforms in the library using 
            <a class="citerefentry" href="clIcdGetPlatformIDsKHR.html"><span class="citerefentry"><span class="refentrytitle">clIcdGetPlatformIDsKHR</span></span></a>.
            For each of these platforms, the ICD Loader queries the platform's 
            extension string to verify that <code class="function">cl_khr_icd</code> 
            is supported, then queries the platform's Vendor ICD 
            extension suffix using 
            <a class="citerefentry" href="clGetPlatformInfo.html"><span class="citerefentry"><span class="refentrytitle">clGetPlatformInfo</span></span></a> 
            with the value <code class="constant">CL_PLATFORM_ICD_SUFFIX_KHR</code>.
        </p>
        <p>
            If any of these steps fail, the ICD Loader will 
            ignore the Vendor ICD and continue on to the 
            next.
        </p>
      </div>
      <div class="refsect1">
        <a id="specification"></a>
        <h2>Specification</h2>
        <p>
            <img src="pdficon_small1.gif" />

            <a href="https://www.khronos.org/registry/cl/specs/opencl-2.0-extensions.pdf#page=127" target="OpenCL Spec">OpenCL Specification</a>
        </p>
      </div>
      <div class="refsect1">
        <a id="seealso"></a>
        <h2>Also see</h2>
        <p>
            <a class="citerefentry" href="EXTENSION.html"><span class="citerefentry"><span class="refentrytitle">EXTENSION</span></span></a>, 
            <a class="citerefentry" href="clIcdGetPlatformIDsKHR.html"><span class="citerefentry"><span class="refentrytitle">clIcdGetPlatformIDsKHR</span></span></a>
        </p>
      </div>
      <div xmlns="" class="refsect3" lang="en" xml:lang="en"><a xmlns="http://www.w3.org/1999/xhtml" id="Copyright"></a><h4 xmlns="http://www.w3.org/1999/xhtml"></h4><img xmlns="http://www.w3.org/1999/xhtml" src="KhronosLogo.jpg" /><p xmlns="http://www.w3.org/1999/xhtml"></p>Copyright © 2007-2013 The Khronos Group Inc.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and/or associated documentation files (the
"Materials"), to deal in the Materials without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Materials, and to
permit persons to whom the Materials are furnished to do so, subject to
the condition that this copyright notice and permission notice shall be included
in all copies or substantial portions of the Materials.
</div>
    </div>
  </body>
</html>
